'''参考第6章最后一个例子，按照8.2接节中的方法重新实现一个有比较好函数封装的《Hamlet》文本词频统计程序。'''
#定义一个把文本内的标点符号都替换为空格的函数
def getText():
    fileName = input('请输入你想打开的文件的文件名（包括后缀）：')
    txt = open(fileName,'r').read()    #导入文档
    txt = txt.lower()    #全部变为小写，消除单词之间大小写的区别
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
        txt = txt.replace(ch,' ')    #将文本中特殊字符替换为空格
    return txt

def txt2dic(txt):
    words = txt.split()
    counts = {}
    for word in words:    #对于文章内的每一个单词
        counts[word] = counts.get(word,0) + 1    #counts中的word键的value赋值为原值+1，默认值是0
    return counts

def sortWord(dic):
    items = list(dic.items())    #用.items()方法把字典转换为列表来记录，key是第一列，value是第二列
    items.sort(key=lambda x:x[1],reverse=True)    #列表支持用.sort()方法排序，默认由小到大，输入reverse参数后改为从大到小排序
    return items

def outputWord(ls,n):
    for i in range(n):
        word,count = ls[i]    #输出items类表的两列
        print('{0:<10}{1:>5}'.format(word,count))

def main():
    txt = getText()
    dic = txt2dic(txt)
    ls = sortWord(dic)
    outputWord(ls,10)

main()
